/**
 * Create in 2012-11-5 下午3:21:23.
 */
package kit4j.app.notepad.service;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

import kit4j.app.notepad.config.ConfigureFaildedException;
import kit4j.util.lang.StringUtil;
import kit4j.util.swing.SwingUtil;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 异常捕获服务类。
 * 
 * @author MiniKnife
 * 
 */
public class ExceptionCatchService {

	private static final Logger logger = LoggerFactory.getLogger(ExceptionCatchService.class);

	private static ExceptionCatchService instance = new ExceptionCatchService();

	private ExceptionCatchService() {

	}

	/**
	 * 获取异常捕获服务类实例。
	 * 
	 * @return 异常捕获服务类。
	 */
	public static ExceptionCatchService getInstance() {
		return instance;
	}

	/**
	 * 捕获一个异常。
	 * 
	 * @param e
	 *            被捕获的异常。
	 */
	public void catchException(Exception e) {
		logException(e);
		promptException(e);
	}

	/**
	 * 对给定的异常进行日志记录。
	 * 
	 * @param e
	 *            异常
	 */
	protected void logException(Exception e) {
		logger.error(null, e);
	}

	/**
	 * 对给定的异常进行显示提醒。
	 * 
	 * @param e
	 *            异常
	 */
	protected void promptException(Exception e) {
		StringBuilder msg = new StringBuilder();
		String emsg = e.getMessage();
		Throwable cause = e.getCause();

		if (e instanceof ConfigureFaildedException) {
			msg.append("配置载入失败:");
		}
		if (StringUtil.isEmpty(emsg)) {
			emsg = "未知错误";
		}

		msg.append(emsg);

		if (cause != null) {
			msg.append("\n原因:");
			msg.append(cause.getMessage());
		}

		promptErrorMessage(msg.toString(), "error");
	}

	protected void promptErrorMessage(String msg, String title) {
		JFrame frame = SwingUtil.getLastFrame();
		JOptionPane.showMessageDialog(frame, msg, title, JOptionPane.ERROR_MESSAGE);
	}
}
